package org.zxp.gc.reference;

import org.junit.Test;

import java.util.ArrayList;

/**
 * @program: effectiveJava
 * @description: 测试强引用
 * @author: X-Pacific zhang
 * @create: 2019-05-19 17:52
 **/
public class TestStrongReference {
    //判断一个对象是否还有可能被使用，程序无法再引用到该对象，那么这个对象就肯定可以被回收，这个状态称为不可达。
//    //GC roots ，也就是根对象，如果从一个对象没有到达根对象的路径，或者说从根对象开始无法引用到该对象，该对象就是不可达的。
////    Roots对象有哪些？
////    1、引用栈帧中的本地变量表的所有对象；
////    2、引用方法区中静态属性的所有对象；
////    3、引用方法区中常量的所有对象；
////    4、引用Native方法的所有对象。



    public static void main(String[] args){
        Apple appleRed = new Apple("red");//在这个方法内这就是强引用，不会被回收
        new TestStrongReference().gcApple();//gcApple方法执行完成后，apple4对象无法再被引用了要回收
        System.gc();
    }


    @Test
    public void testGC(){
        Apple apple0 = new Apple("0");
        apple0 = null;// 帮助垃圾收集器回收此对象 这么做了以后apple对象可能在main方法没执行完之前就被回收了

        ArrayList<Apple> apples = new ArrayList<>();
        Apple apple1 = new Apple("1");//由于apple1的引用在方法栈中还在，所以apple1无法被回收
        apples.add(apple1);
        apples.add(new Apple("2"));//可以回收
        apples.add(new Apple("3"));//可以回收
        apples.clear();
        apples = null;
        System.out.println(apples);
        TestStrongReference testStrongReference = new TestStrongReference();
        testStrongReference.gcApple();//可以回收

        System.gc();
    }

    public void gcApple(){
        Apple apple4 = new Apple("4");//这是一个Roots根节点，当gcApple方法执行完成后，apple4对象无法再被引用了
    }




    @Test
    public void testObjectNull(){
        Apple apple = new Apple("1");
        testMe(apple);
        System.out.println(apple.getName());
        System.out.println(apple);
    }


    public void testMe(Apple apple){
//        apple.setName("2");
        apple = null;
    }
}
